//package com.aps.algorithm.simple;
//
//import com.aps.algorithm.core.AbstractAPSAlgorithm;
//import com.aps.common.model.APSProductModel;
//import com.aps.common.model.SchedulingResult;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.stereotype.Component;
//
//import java.time.LocalDate;
//import java.time.LocalDateTime;
//import java.time.format.DateTimeFormatter;
//import java.time.temporal.ChronoUnit;
//import java.util.Comparator;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//import java.util.stream.Collectors;
//
///**
// * 关键比率（Critical Ratio）算法
// * CR = (交期 - 当前日期) / 总加工时间
// * CR值越小，优先级越高
// */
//@Slf4j
//@Component
//public class CriticalRatioAlgorithm extends AbstractAPSAlgorithm {
//
//    private static final String ALGORITHM_NAME = "CriticalRatio";
//    private static final String ALGORITHM_DESCRIPTION = "关键比率算法 - 基于交期紧急程度和加工时间的优先级排序";
//
//    @Override
//    public String getAlgorithmName() {
//        return ALGORITHM_NAME;
//    }
//
//    @Override
//    public String getAlgorithmDescription() {
//        return ALGORITHM_DESCRIPTION;
//    }
//
//    @Override
//    protected SchedulingResult doExecute(APSProductModel model) {
//        log.info("开始执行关键比率算法");
//
//        // 1. 计算每个订单的CR值
//        List<APSProductModel.ProductionOrder> ordersWithCR = calculateCriticalRatios(model);
//
//        // 2. 按CR值排序（升序，CR值越小优先级越高）
//        List<APSProductModel.ProductionOrder> sortedOrders = ordersWithCR.stream()
//            .sorted(Comparator.comparing(APSProductModel.ProductionOrder::getCriticalRatio))
//            .collect(Collectors.toList());
//
//        // 3. 生成排程结果
//        SchedulingResult result = createSchedulingResult(sortedOrders, model);
//
//        log.info("关键比率算法执行完成，共处理 {} 个订单", sortedOrders.size());
//
//        return result;
//    }
//
//    /**
//     * 计算关键比率
//     * @param model APS产品模型
//     * @return 包含CR值的订单列表
//     */
//    private List<APSProductModel.ProductionOrder> calculateCriticalRatios(APSProductModel model) {
//        LocalDate currentDate = LocalDate.now();
//
//        return model.getOrders().stream()
//            .peek(order -> {
//                double cr = calculateCriticalRatio(order, currentDate, model);
//                order.setCriticalRatio(cr);
//            })
//            .collect(Collectors.toList());
//    }
//
//    /**
//     * 计算单个订单的关键比率
//     * @param order 生产订单
//     * @param currentDate 当前日期
//     * @param model APS产品模型
//     * @return 关键比率值
//     */
//    private double calculateCriticalRatio(APSProductModel.ProductionOrder order,
//                                       LocalDate currentDate,
//                                       APSProductModel model) {
//
//        // 解析交期
//        LocalDate deliveryDate = LocalDate.parse(order.getDeliveryDate(),
//            DateTimeFormatter.ofPattern("yyyy-MM-dd"));
//
//        // 计算剩余天数
//        long daysToDelivery = ChronoUnit.DAYS.between(currentDate, deliveryDate);
//
//        // 计算总加工时间（分钟）
//        double totalProcessingTime = calculateTotalProcessingTime(order, model);
//
//        // 转换为天数（假设每天8小时工作）
//        double processingDays = totalProcessingTime / (8 * 60);
//
//        // 计算CR值
//        double cr;
//        if (processingDays > 0) {
//            cr = daysToDelivery / processingDays;
//        } else {
//            cr = daysToDelivery > 0 ? Double.MAX_VALUE : 0.0;
//        }
//
//        // 记录指标
//        context.addMetric("cr_value_" + order.getId(), cr);
//
//        return cr;
//    }
//
//    /**
//     * 计算订单的总加工时间
//     * @param order 生产订单
//     * @param model APS产品模型
//     * @return 总加工时间（分钟）
//     */
//    private double calculateTotalProcessingTime(APSProductModel.ProductionOrder order,
//                                              APSProductModel model) {
//
//        double totalTime = 0.0;
//
//        // 遍历所有工序
//        for (APSProductModel.Operation operation : model.getOperations()) {
//            // 标准工时 * 订单数量
//            double operationTime = operation.getStandardTime() * order.getQuantity();
//            // 加上换型时间
//            operationTime += operation.getSetupTime();
//
//            totalTime += operationTime;
//        }
//
//        return totalTime;
//    }
//
//    /**
//     * 创建排程结果
//     * @param sortedOrders 排序后的订单
//     * @param model APS产品模型
//     * @return 排程结果
//     */
//    private SchedulingResult createSchedulingResult(List<APSProductModel.ProductionOrder> sortedOrders,
//                                                  APSProductModel model) {
//
//        SchedulingResult result = new SchedulingResult();
//        result.setSchedulingId("CR_" + System.currentTimeMillis());
//        result.setSchedulingTime(LocalDateTime.now());
//        result.setStatus("成功");
//
//        // 创建订单排程
//        List<SchedulingResult.OrderSchedule> orderSchedules = sortedOrders.stream()
//            .map(order -> createOrderSchedule(order, model))
//            .collect(Collectors.toList());
//
//        result.setOrderSchedules(orderSchedules);
//
//        // 创建资源利用率信息
//        result.setResourceUtilizations(createResourceUtilizations(model));
//
//        // 创建排程指标
//        result.setMetrics(createSchedulingMetrics(sortedOrders, model));
//
//        return result;
//    }
//
//    /**
//     * 创建订单排程
//     * @param order 订单
//     * @param model APS产品模型
//     * @return 订单排程
//     */
//    private SchedulingResult.OrderSchedule createOrderSchedule(APSProductModel.ProductionOrder order,
//                                                             APSProductModel model) {
//
//        SchedulingResult.OrderSchedule orderSchedule = new SchedulingResult.OrderSchedule();
//        orderSchedule.setOrderId(order.getId());
//        orderSchedule.setCustomerName(order.getCustomerName());
//        orderSchedule.setProductModel(order.getProductModel());
//        orderSchedule.setQuantity(order.getQuantity());
//        orderSchedule.setDeliveryDate(order.getDeliveryDate());
//        orderSchedule.setPriority(order.getPriority());
//        orderSchedule.setOrderAmount(order.getOrderAmount());
//
//        // 创建工序排程
//        List<SchedulingResult.OperationSchedule> operationSchedules = model.getOperations().stream()
//            .map(operation -> createOperationSchedule(operation, order))
//            .collect(Collectors.toList());
//
//        orderSchedule.setOperationSchedules(operationSchedules);
//
//        return orderSchedule;
//    }
//
//    /**
//     * 创建工序排程
//     * @param operation 工序
//     * @param order 订单
//     * @return 工序排程
//     */
//    private SchedulingResult.OperationSchedule createOperationSchedule(APSProductModel.Operation operation,
//                                                                      APSProductModel.ProductionOrder order) {
//
//        SchedulingResult.OperationSchedule operationSchedule = new SchedulingResult.OperationSchedule();
//        operationSchedule.setOperationId(operation.getId());
//        operationSchedule.setOperationName(operation.getName());
//        operationSchedule.setSequence(operation.getSequence());
//        operationSchedule.setEquipmentType(operation.getEquipmentType());
//        operationSchedule.setStandardTime(operation.getStandardTime());
//        operationSchedule.setSetupTime(operation.getSetupTime());
//        operationSchedule.setPersonnelRequirement(operation.getPersonnelRequirement());
//        operationSchedule.setQualityRequirement(operation.getQualityRequirement());
//
//        // 简单的资源分配（这里只是示例，实际应该根据资源可用性进行分配）
//        if (operation.getRequiredResources() != null && !operation.getRequiredResources().isEmpty()) {
//            operationSchedule.setAssignedEquipmentId(operation.getRequiredResources().get(0));
//        }
//
//        return operationSchedule;
//    }
//
//    /**
//     * 创建资源利用率信息
//     * @param model APS产品模型
//     * @return 资源利用率映射
//     */
//    private java.util.Map<String, SchedulingResult.ResourceUtilization> createResourceUtilizations(APSProductModel model) {
//        Map<String, SchedulingResult.ResourceUtilization> utilizations = new HashMap<>();
//
//        // 处理设备资源
//        if (model.getResources().getEquipment() != null) {
//            for (APSProductModel.EquipmentResource equipment : model.getResources().getEquipment()) {
//                SchedulingResult.ResourceUtilization utilization = new SchedulingResult.ResourceUtilization();
//                utilization.setResourceId(equipment.getId());
//                utilization.setResourceName(equipment.getName());
//                utilization.setResourceType(equipment.getType());
//                utilization.setTotalAvailableTime(equipment.getDailyCapacity());
//                utilization.setUsedTime(0.0); // 这里需要根据实际排程计算
//                utilization.setIdleTime(equipment.getDailyCapacity());
//                utilization.setUtilizationRate(0.0);
//
//                utilizations.put(equipment.getId(), utilization);
//            }
//        }
//
//        return utilizations;
//    }
//
//    /**
//     * 创建排程指标
//     * @param orders 订单列表
//     * @param model APS产品模型
//     * @return 排程指标
//     */
//    private SchedulingResult.SchedulingMetrics createSchedulingMetrics(List<APSProductModel.ProductionOrder> orders,
//                                                                      APSProductModel model) {
//
//        SchedulingResult.SchedulingMetrics metrics = new SchedulingResult.SchedulingMetrics();
//        metrics.setTotalOrders(orders.size());
//        metrics.setAverageResourceUtilization(0.0); // 需要根据实际排程计算
//        metrics.setResourceBalanceScore(0.0); // 需要根据实际排程计算
//        metrics.setTotalMakespan(0.0); // 需要根据实际排程计算
//        metrics.setTotalCost(orders.stream().mapToDouble(order -> order.getOrderAmount()).sum());
//
//        return metrics;
//    }
//}
